logo
Free, unlimited AI code reviews that run on commit
git-lrc git-lrc GitHub Install Now We'd appreciate a star git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt git-lrc - Free, unlimited AI code reviews that run on commit | Product Hunt

Object::Declare - Declarative object constructor

Author

       Shlomi Fish <shlomif@cpan.org>

Authors

       Audrey Tang <cpan@audreyt.org>

Bugs

       Please     report     any     bugs     or     feature     requests     on    the    bugtracker    website
       <https://github.com/shlomif/perl-Object-Declare/issues>

       When submitting a bug or request, please include a test-file or a patch to  an  existing  test-file  that
       illustrates the bug or desired feature.

Description

       This module exports one function, "declare", for building named objects with a declarative syntax,
       similar to how Jifty::DBI::Schema defines its columns.

       In list context, "declare" returns a list of name/object pairs in the order of declaration (allowing
       duplicates), suitable for putting into a hash.  In scalar context, "declare" returns a hash reference.

       Using a flexible "import" interface, one can change exported helper functions names (declarator), words
       to link labels and values together (copula), and the table of named classes to declare (mapping):

           use Object::Declare
               declarator  => ['declare'],     # list of declarators
               copula      => {                # list of words, or a map
                   is  => '',                  #  from copula to label prefixes,
                   are => '',                  #  or to callback that e.g. turns
                   has => sub { has => @_ },   #  "has X" to "has is X" and
                                               #  "X has 1" to "has is [X => 1]"
               },
               aliases     => {                # list of label aliases:
                   more => 'less',             #  turns "is more" into "is less"
                                               #  and "more is 1" into "less is 1"
               },
               mapping     => {
                   column => 'MyApp::Column',  # class name to call ->new to
                   param  => sub {             # arbitrary coderef also works
                       bless(\@_, 'MyApp::Param');
                   },
               };

       After the declarator block finishes execution, all helper functions are removed from the package.  Same-
       named functions (such as &is and &are) that existed before the declarator's execution are restored
       correctly.

Name

       Object::Declare - Declarative object constructor

Notes

       If you export the declarator to another package via @EXPORT, be sure to export all mapping keys as well.
       For example, this will work for the example above:

           our @EXPORT = qw( declare column param );

       But this will not:

           our @EXPORT = qw( declare );

       The copula are not turned into functions, so there is no need to export them.

Support

Websites
       The following websites have more information about this module, and may be of help to you. As always, in
       addition to those websites please use your favorite search engine to discover more resources.

       •   MetaCPAN

           A modern, open-source CPAN search engine, useful to view POD in HTML format.

           <https://metacpan.org/release/Object-Declare>

       •   RT: CPAN's Bug Tracker

           The RT ( Request Tracker ) website is the default bug/issue tracking system for CPAN.

           <https://rt.cpan.org/Public/Dist/Display.html?Name=Object-Declare>

       •   CPANTS

           The CPANTS is a website that analyzes the Kwalitee ( code metrics ) of a distribution.

           <http://cpants.cpanauthors.org/dist/Object-Declare>

       •   CPAN Testers

           The  CPAN  Testers  is  a  network  of  smoke  testers  who  run  automated  tests  on  uploaded CPAN
           distributions.

           <http://www.cpantesters.org/distro/O/Object-Declare>

       •   CPAN Testers Matrix

           The CPAN Testers Matrix is a website that provides a visual  overview  of  the  test  results  for  a
           distribution on various Perls/platforms.

           <http://matrix.cpantesters.org/?dist=Object-Declare>

       •   CPAN Testers Dependencies

           The CPAN Testers Dependencies is a website that shows a chart of the test results of all dependencies
           for a distribution.

           <http://deps.cpantesters.org/?module=Object::Declare>

   Bugs/FeatureRequests
       Please  report  any  bugs or feature requests by email to "bug-object-declare at rt.cpan.org", or through
       the web  interface  at  <https://rt.cpan.org/Public/Bug/Report.html?Queue=Object-Declare>.  You  will  be
       automatically notified of any progress on the request by the system.

   SourceCode
       The  code  is open to the world, and available for you to hack on. Please feel free to browse it and play
       with it, or whatever. If you want to contribute patches, please send me a diff or prod me  to  pull  from
       your repository :)

       <https://github.com/shlomif/perl-Object-Declare>

         git clone git://github.com/shlomif/perl-Object-Declare.git

Synopsis

           use Object::Declare ['MyApp::Column', 'MyApp::Param'];

           my %objects = declare {

           param foo =>
              !is global,
               is immutable,
               valid_values are qw( more values );

           column bar =>
               field1 is 'value',
               field2 is 'some_other_value',
               sub_params are param( is happy ), param ( is sad );

           };

           print $objects{foo}; # a MyApp::Param object
           print $objects{bar}; # a MyApp::Column object

           # Assuming that MyApp::Column::new simply blesses into a hash...
           print $objects{bar}{sub_params}[0]; # a MyApp::Param object
           print $objects{bar}{sub_params}[1]; # a MyApp::Param object

Version

       version 0.25

See Also