[libclass-tiny-perl] 09/22: write initial documentation

gregor herrmann gregoa at debian.org
Sun May 31 14:03:04 UTC 2015


This is an automated email from the git hooks/post-receive script.

gregoa pushed a commit to annotated tag release-0.001
in repository libclass-tiny-perl.

commit 7e0235a09e3dd3a5dc85b3ae1b0f00265fc672cf
Author: David Golden <dagolden at cpan.org>
Date:   Thu Aug 15 22:57:32 2013 -0400

    write initial documentation
---
 META.json         |   1 +
 README.pod        | 137 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 lib/Class/Tiny.pm | 116 ++++++++++++++++++++++++++++++++++++++++-----
 3 files changed, 232 insertions(+), 22 deletions(-)

diff --git a/META.json b/META.json
index 7d03c2a..8477fad 100644
--- a/META.json
+++ b/META.json
@@ -57,6 +57,7 @@
             "Test::FailWarnings" : "0",
             "Test::Fatal" : "0",
             "Test::More" : "0.96",
+            "base" : "0",
             "lib" : "0"
          }
       }
diff --git a/README.pod b/README.pod
index 3398adb..ffb3b84 100644
--- a/README.pod
+++ b/README.pod
@@ -12,33 +12,148 @@ version 0.001
 
 =head1 SYNOPSIS
 
-  package MyClass;
+In F<Person.pm>:
 
-  use Class::Tiny qw( name color );
+  package Person;
+
+  use Class::Tiny qw( name );
+
+  1;
+
+In F<Employee.pm>:
+
+  package Employee;
+  use parent 'Person';
+
+  use Class::Tiny qw( ssn );
 
   1;
 
-  package main;
+In F<example.pl>:
 
-  MyClass->new( name => "Larry", color => "orange" );
+  use Employee;
+
+  my $obj = Employee->new( name => "Larry", ssn => "111-22-3333" );
+
+  # unknown attributes are fatal:
+  eval { Employee->new( name => "Larry", OS => "Linux" ) };
 
 =head1 DESCRIPTION
 
-This module might be cool, but you'd never know it from the lack
-of documentation.
+This module offers a minimalist class construction kit in under 100 lines of
+code.  Here is a list of features:
+
+=over 4
+
+=item *
+
+defines attributes via import arguments
+
+=item *
+
+generates accessors for all attributes
+
+=item *
+
+superclass provides a standard C<new> constructor
+
+=item *
+
+C<new> takes a hash reference or list of key/value pairs
+
+=item *
+
+C<new> throws an error for unknown attributes
+
+=item *
+
+may be subclassed
+
+=back
+
+It uses no non-core modules (except on Perls older than 5.10, where it requires
+L<MRO::Compat> from CPAN).
+
+=head2 Why this instead of Object::Tiny or Class::Accessor or something else?
 
-This is inspired by L<Object::Tiny::RW> with just a couple more features
-to make it useful for class hierarchies.
+I wanted something so simple that it could be potentially used by core Perl
+modules I help maintain, most of which either use L<Class::Struct> or
+roll-their-own OO framework for each one.
+
+L<Object::Tiny> and L<Object::Tiny::RW> were close to what I wanted, but
+lacking some features I deemed necessary, and their maintainers have an even
+more strict philsophy against feature creep that I have.
+
+Compared to everything else, this is smaller in implmentation and simpler in
+API.  (The only API is a list of attributes!)
 
 =for Pod::Coverage method_names_here
 
 =head1 USAGE
 
-Good luck!
+=head2 Defining attributes
+
+Define attributes as a list of import arguments:
+
+    package Foo::Bar;
+
+    use Class::Tiny qw(
+        name
+        id
+        height
+        weight
+    );
+
+For each item, a read-write accessor is created:
+
+    $obj->name( "John Doe" );
+
+Attribute names must be valid subroutine identifiers or an exception will
+be thrown.
+
+=head2 Subclassing
+
+Define subclasses as normal.  It's best to define them with L<base>, L<parent>
+or L<superclass> before defining attributes with Class::Tiny so the C<@ISA>
+array is populated at compile-time:
+
+    package Foo::Bar::More;
+
+    use parent 'Foo::Bar';
+
+    use Class::Tiny qw( shoe_size );
+
+If your class does not already inherit from some class, then Class::Tiny will
+be added to your C<@ISA> to provide C<new>.
+
+If your class B<does> inherit from something, then no additional inheritance is
+set up.  If the parent subclasses Class::Tiny, then all is well.  If not, then
+you'll get accessors set up but no constructor (or features that come with it
+like attribute validation).  Don't do that unless you really have a special
+need for it.
+
+=head2 Object construction
+
+If your class inherits from Class::Tiny (which it will by default), it provides
+the C<new> constructor for you.
+
+Object can be created with attributes given as a hash reference or as a list
+of key/value pairs:
+
+    $obj = Foo::Bar->new( name => "David" );
+
+    $obj = Foo::Bar->new( { name => "David" } );
+
+If a reference is passed as a single argument, it must be dereferenceable as a
+hash or an exception is thrown.  A shallow copy is made of the reference provided.
+
+=head2 BUILD
+
+To be implemented...
 
-=head1 SEE ALSO
+=head2 DEMOLISH
 
-Maybe other modules do related things.
+To be implemented...
 
 =for :stopwords cpan testmatrix url annocpan anno bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan
 
diff --git a/lib/Class/Tiny.pm b/lib/Class/Tiny.pm
index 09f8f11..9b6dbcd 100644
--- a/lib/Class/Tiny.pm
+++ b/lib/Class/Tiny.pm
@@ -69,32 +69,126 @@ sub new {
 
 =head1 SYNOPSIS
 
-  package MyClass;
+In F<Person.pm>:
 
-  use Class::Tiny qw( name color );
+  package Person;
+
+  use Class::Tiny qw( name );
 
   1;
 
-  package main;
+In F<Employee.pm>:
+
+  package Employee;
+  use parent 'Person';
+
+  use Class::Tiny qw( ssn );
+
+  1;
 
-  MyClass->new( name => "Larry", color => "orange" );
+In F<example.pl>:
 
+  use Employee;
+
+  my $obj = Employee->new( name => "Larry", ssn => "111-22-3333" );
+
+  # unknown attributes are fatal:
+  eval { Employee->new( name => "Larry", OS => "Linux" ) };
 
 =head1 DESCRIPTION
 
-This module might be cool, but you'd never know it from the lack
-of documentation.
+This module offers a minimalist class construction kit in under 100 lines of
+code.  Here is a list of features:
+
+=for :list
+* defines attributes via import arguments
+* generates accessors for all attributes
+* superclass provides a standard C<new> constructor
+* C<new> takes a hash reference or list of key/value pairs
+* C<new> throws an error for unknown attributes
+* may be subclassed
+
+It uses no non-core modules (except on Perls older than 5.10, where it requires
+L<MRO::Compat> from CPAN).
 
-This is inspired by L<Object::Tiny::RW> with just a couple more features
-to make it useful for class hierarchies.
+=head2 Why this instead of Object::Tiny or Class::Accessor or something else?
+
+I wanted something so simple that it could be potentially used by core Perl
+modules I help maintain, most of which either use L<Class::Struct> or
+roll-their-own OO framework for each one.
+
+L<Object::Tiny> and L<Object::Tiny::RW> were close to what I wanted, but
+lacking some features I deemed necessary, and their maintainers have an even
+more strict philsophy against feature creep that I have.
+
+Compared to everything else, this is smaller in implmentation and simpler in
+API.  (The only API is a list of attributes!)
 
 =head1 USAGE
 
-Good luck!
+=head2 Defining attributes
+
+Define attributes as a list of import arguments:
+
+    package Foo::Bar;
+
+    use Class::Tiny qw(
+        name
+        id
+        height
+        weight
+    );
+
+For each item, a read-write accessor is created:
+
+    $obj->name( "John Doe" );
+
+Attribute names must be valid subroutine identifiers or an exception will
+be thrown.
+
+=head2 Subclassing
+
+Define subclasses as normal.  It's best to define them with L<base>, L<parent>
+or L<superclass> before defining attributes with Class::Tiny so the C<@ISA>
+array is populated at compile-time:
+
+    package Foo::Bar::More;
+
+    use parent 'Foo::Bar';
+
+    use Class::Tiny qw( shoe_size );
+
+If your class does not already inherit from some class, then Class::Tiny will
+be added to your C<@ISA> to provide C<new>.
+
+If your class B<does> inherit from something, then no additional inheritance is
+set up.  If the parent subclasses Class::Tiny, then all is well.  If not, then
+you'll get accessors set up but no constructor (or features that come with it
+like attribute validation).  Don't do that unless you really have a special
+need for it.
+
+=head2 Object construction
+
+If your class inherits from Class::Tiny (which it will by default), it provides
+the C<new> constructor for you.
+
+Object can be created with attributes given as a hash reference or as a list
+of key/value pairs:
+
+    $obj = Foo::Bar->new( name => "David" );
+
+    $obj = Foo::Bar->new( { name => "David" } );
+
+If a reference is passed as a single argument, it must be dereferenceable as a
+hash or an exception is thrown.  A shallow copy is made of the reference provided.
+
+=head2 BUILD
+
+To be implemented...
 
-=head1 SEE ALSO
+=head2 DEMOLISH
 
-Maybe other modules do related things.
+To be implemented...
 
 =cut
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libclass-tiny-perl.git



More information about the Pkg-perl-cvs-commits mailing list