Object-Declare-0.25000755001750001750 013743057066 14503 5ustar00shlomifshlomif000000000000README100644001750001750 44513743057066 15427 0ustar00shlomifshlomif000000000000Object-Declare-0.25This archive contains the distribution Object-Declare, version 0.25: Declarative object constructor This software is Copyright (c) 2006 by Audrey Tang. This is free software, licensed under: The MIT (X11) License This README file was generated by Dist::Zilla::Plugin::Readme v6.015. LICENSE100644001750001750 203713743057066 15573 0ustar00shlomifshlomif000000000000Object-Declare-0.25Copyright (c) 2006 Audrey Tang Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Changes100644001750001750 762713743057066 16073 0ustar00shlomifshlomif000000000000Object-Declare-0.250.25 2020-10-18 - dist.ini / weaver.ini / .tidyallrc / etc. cleanup - Move to @SHLOMIF - Inspired by Lady_Aleena. 0.24 2018-10-07 * Added [MetaJSON] to dist.ini so releases include a META.json file * Convert dist.ini to [@SHLOMIF] 0.23 2016-02-12 * Convert the distribution from Module-Install to Dist-Zilla. * Start maintaining in a GitHub repository. * Add a LICENSE file. * Removed trailing whitespace - with a test. * Remove the SIGNATURE file - at least temporarily. 0.22 2007-02-09 * Allow declarations in copula callbacks as return value: copula => foo => sub { bar is 1, baz is 2 } * No longer raise bogus "overload method not found" errors when paritally-formed declarations objects is e.g. printed out for debugging purposes. 0.21 2007-01-26 * Helper functions for mapping keys are no longer present within dynamic scope of mapping construction callbacks; this allows you to have call a method that has the same name as a mapping key during ->new() and other callbacks. * Support for fully qualified fields: "Very::Happy is 42" and "is Very::Happy" are valid even when Very::Happy is not yet loaded. * Support for associating coderefs with copula for even more flexible rewriting of arguments: 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]" }, 0.20 2007-01-16 * Sub::Override is no longer a dependency for this module. * Values in declarations can now contain nested sub-objects by calling the declarators again: column foo => field is column( field is 'foo' ); Contributed by: Jason Adams 0.13 2006-07-21 * Introduce the "synonyms" interface, a mapping for alternate spelling for field names. 0.12 2006-07-20 * The "isn't" keyword in 0.11 broke Test::More, and I can't find a way to reconcile them, so it's now sadly retracted. 0.11 2006-07-20 * Support the prefix ! operator on declarations, so negated ones such as "!is global" or "!global is $x" now work. Requested by: Jesse Vincent * Also introduce the "isn't" negated copula. Requested by: Jesse Vincent 0.10 2006-07-20 * The "copula" interface now accepts an arbitrary prefix for each copula (defaults to ''), which can be used to distinguish labels built by different copular words. 0.09 2006-07-18 * The "mapping" interface now accepts arbitrary code reference as the builder function, in addition to class names to call ->new to. 0.08 2006-07-18 * Added lots of documentation and comments. * Now works correctly even if at runtime the symbol table entries created at compile-time get deleted. 0.07 2006-07-18 * Chained "is foo, is bar, is baz" now works; previously only the first one is recognized. Reported by: Steven Little 0.06 2006-07-17 * Documentation cleanup; no functional changes. 0.05 2006-07-17 * Support for ordered declarations, via list-context return of "declare". In scalar context, it still returns a hash reference. 0.04 2006-07-17 * Support for plural values via "are": column x => field1 is 'xxx', field2 are 'XXX', 'XXX', # <-- Plural value is field3; 0.03 2006-07-17 * The declarator can now be exported to another package; this works because internally, each declarator remembers the class mappings and copula it was associated with. 0.02 2006-07-17 * Documentation cleanup; no functional changes. 0.01 2006-07-17 * Initial CPAN release. dist.ini100644001750001750 43113743057066 16206 0ustar00shlomifshlomif000000000000Object-Declare-0.25name = Object-Declare author = Shlomi Fish license = MIT copyright_holder = Audrey Tang copyright_year = 2006 version = 0.25 [@Filter] -bundle = @SHLOMIF -remove = License dist = Object-Declare github_name = perl-Object-Declare [Test::Kwalitee] [Test::TidyAll] Changes~100644001750001750 741513743057066 16264 0ustar00shlomifshlomif000000000000Object-Declare-0.250.24 2018-10-07 * Added [MetaJSON] to dist.ini so releases include a META.json file * Convert dist.ini to [@SHLOMIF] 0.23 2016-02-12 * Convert the distribution from Module-Install to Dist-Zilla. * Start maintaining in a GitHub repository. * Add a LICENSE file. * Removed trailing whitespace - with a test. * Remove the SIGNATURE file - at least temporarily. 0.22 2007-02-09 * Allow declarations in copula callbacks as return value: copula => foo => sub { bar is 1, baz is 2 } * No longer raise bogus "overload method not found" errors when paritally-formed declarations objects is e.g. printed out for debugging purposes. 0.21 2007-01-26 * Helper functions for mapping keys are no longer present within dynamic scope of mapping construction callbacks; this allows you to have call a method that has the same name as a mapping key during ->new() and other callbacks. * Support for fully qualified fields: "Very::Happy is 42" and "is Very::Happy" are valid even when Very::Happy is not yet loaded. * Support for associating coderefs with copula for even more flexible rewriting of arguments: 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]" }, 0.20 2007-01-16 * Sub::Override is no longer a dependency for this module. * Values in declarations can now contain nested sub-objects by calling the declarators again: column foo => field is column( field is 'foo' ); Contributed by: Jason Adams 0.13 2006-07-21 * Introduce the "synonyms" interface, a mapping for alternate spelling for field names. 0.12 2006-07-20 * The "isn't" keyword in 0.11 broke Test::More, and I can't find a way to reconcile them, so it's now sadly retracted. 0.11 2006-07-20 * Support the prefix ! operator on declarations, so negated ones such as "!is global" or "!global is $x" now work. Requested by: Jesse Vincent * Also introduce the "isn't" negated copula. Requested by: Jesse Vincent 0.10 2006-07-20 * The "copula" interface now accepts an arbitrary prefix for each copula (defaults to ''), which can be used to distinguish labels built by different copular words. 0.09 2006-07-18 * The "mapping" interface now accepts arbitrary code reference as the builder function, in addition to class names to call ->new to. 0.08 2006-07-18 * Added lots of documentation and comments. * Now works correctly even if at runtime the symbol table entries created at compile-time get deleted. 0.07 2006-07-18 * Chained "is foo, is bar, is baz" now works; previously only the first one is recognized. Reported by: Steven Little 0.06 2006-07-17 * Documentation cleanup; no functional changes. 0.05 2006-07-17 * Support for ordered declarations, via list-context return of "declare". In scalar context, it still returns a hash reference. 0.04 2006-07-17 * Support for plural values via "are": column x => field1 is 'xxx', field2 are 'XXX', 'XXX', # <-- Plural value is field3; 0.03 2006-07-17 * The declarator can now be exported to another package; this works because internally, each declarator remembers the class mappings and copula it was associated with. 0.02 2006-07-17 * Documentation cleanup; no functional changes. 0.01 2006-07-17 * Initial CPAN release. META.yml100644001750001750 2660113743057066 16062 0ustar00shlomifshlomif000000000000Object-Declare-0.25--- abstract: 'Declarative object constructor' author: - 'Shlomi Fish ' build_requires: File::Spec: '0' IO::Handle: '0' IPC::Open3: '0' Module::Build: '0.28' Test::More: '0.88' ok: '0' configure_requires: ExtUtils::MakeMaker: '0' Module::Build: '0.28' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.015, CPAN::Meta::Converter version 2.150010' license: mit meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Object-Declare provides: Object::Declare: file: lib/Object/Declare.pm version: '0.25' Object::Declare::Katamari: file: lib/Object/Declare.pm version: '0.25' requires: overload: '0' perl: '5.006' strict: '0' warnings: '0' resources: bugtracker: https://github.com/shlomif/perl-Object-Declare/issues homepage: http://metacpan.org/release/Object-Declare repository: git://github.com/shlomif/perl-Object-Declare.git version: '0.25' x_Dist_Zilla: perl: version: '5.032000' plugins: - class: Dist::Zilla::Plugin::Prereqs config: Dist::Zilla::Plugin::Prereqs: phase: test type: requires name: '@Filter/TestMoreDoneTesting' version: '6.015' - class: Dist::Zilla::Plugin::AutoPrereqs name: '@Filter/AutoPrereqs' version: '6.015' - class: Dist::Zilla::Plugin::ExecDir name: '@Filter/ExecDir' version: '6.015' - class: Dist::Zilla::Plugin::GatherDir config: Dist::Zilla::Plugin::GatherDir: exclude_filename: [] exclude_match: [] follow_symlinks: 0 include_dotfiles: 0 prefix: '' prune_directory: [] root: . name: '@Filter/GatherDir' version: '6.015' - class: Dist::Zilla::Plugin::ManifestSkip name: '@Filter/ManifestSkip' version: '6.015' - class: Dist::Zilla::Plugin::MetaYAML name: '@Filter/MetaYAML' version: '6.015' - class: Dist::Zilla::Plugin::PruneCruft name: '@Filter/PruneCruft' version: '6.015' - class: Dist::Zilla::Plugin::Readme name: '@Filter/Readme' version: '6.015' - class: Dist::Zilla::Plugin::RunExtraTests config: Dist::Zilla::Role::TestRunner: default_jobs: '9' name: '@Filter/RunExtraTests' version: '0.029' - class: Dist::Zilla::Plugin::ShareDir name: '@Filter/ShareDir' version: '6.015' - class: Dist::Zilla::Plugin::MakeMaker config: Dist::Zilla::Role::TestRunner: default_jobs: '9' name: '@Filter/MakeMaker' version: '6.015' - class: Dist::Zilla::Plugin::CheckChangesHasContent name: '@Filter/CheckChangesHasContent' version: '0.011' - class: Dist::Zilla::Plugin::ConfirmRelease name: '@Filter/ConfirmRelease' version: '6.015' - class: Dist::Zilla::Plugin::Manifest name: '@Filter/Manifest' version: '6.015' - class: Dist::Zilla::Plugin::MetaConfig name: '@Filter/MetaConfig' version: '6.015' - class: Dist::Zilla::Plugin::MetaJSON name: '@Filter/MetaJSON' version: '6.015' - class: Dist::Zilla::Plugin::MetaProvides::Package config: Dist::Zilla::Plugin::MetaProvides::Package: finder_objects: - class: Dist::Zilla::Plugin::FinderCode name: '@Filter/MetaProvides::Package/AUTOVIV/:InstallModulesPM' version: '6.015' include_underscores: 0 Dist::Zilla::Role::MetaProvider::Provider: $Dist::Zilla::Role::MetaProvider::Provider::VERSION: '2.002004' inherit_missing: '1' inherit_version: '1' meta_noindex: '1' Dist::Zilla::Role::ModuleMetadata: Module::Metadata: '1.000037' version: '0.006' name: '@Filter/MetaProvides::Package' version: '2.004003' - class: Dist::Zilla::Plugin::MetaResources name: '@Filter/MetaResources' version: '6.015' - class: Dist::Zilla::Plugin::ModuleBuild config: Dist::Zilla::Role::TestRunner: default_jobs: '9' name: '@Filter/ModuleBuild' version: '6.015' - class: Dist::Zilla::Plugin::PkgVersion name: '@Filter/PkgVersion' version: '6.015' - class: Dist::Zilla::Plugin::PodCoverageTests name: '@Filter/PodCoverageTests' version: '6.015' - class: Dist::Zilla::Plugin::PodSyntaxTests name: '@Filter/PodSyntaxTests' version: '6.015' - class: Dist::Zilla::Plugin::Test::Compile config: Dist::Zilla::Plugin::Test::Compile: bail_out_on_fail: '0' fail_on_warning: author fake_home: 0 filename: t/00-compile.t module_finder: - ':InstallModules' needs_display: 0 phase: test script_finder: - ':PerlExecFiles' skips: [] switch: [] name: '@Filter/Test::Compile' version: '2.058' - class: Dist::Zilla::Plugin::Test::CPAN::Changes config: Dist::Zilla::Plugin::Test::CPAN::Changes: changelog: Changes name: '@Filter/Test::CPAN::Changes' version: '0.012' - class: Dist::Zilla::Plugin::Test::EOL config: Dist::Zilla::Plugin::Test::EOL: filename: xt/author/eol.t finder: - ':ExecFiles' - ':InstallModules' - ':TestFiles' trailing_whitespace: 1 name: '@Filter/Test::EOL' version: '0.19' - class: Dist::Zilla::Plugin::Test::NoTabs config: Dist::Zilla::Plugin::Test::NoTabs: filename: xt/author/no-tabs.t finder: - ':InstallModules' - ':ExecFiles' - ':TestFiles' name: '@Filter/Test::NoTabs' version: '0.15' - class: Dist::Zilla::Plugin::Test::TrailingSpace name: '@Filter/Test::TrailingSpace' version: 0.2.0 - class: Dist::Zilla::Plugin::TestRelease name: '@Filter/TestRelease' version: '6.015' - class: Dist::Zilla::Plugin::PodWeaver config: Dist::Zilla::Plugin::PodWeaver: finder: - ':InstallModules' - ':ExecFiles' plugins: - class: Pod::Weaver::Plugin::SingleEncoding name: '@SHLOMIF/SingleEncoding' version: '4.015' - class: Pod::Weaver::Plugin::WikiDoc name: '@SHLOMIF/WikiDoc' version: '0.093004' - class: Pod::Weaver::Plugin::EnsurePod5 name: '@CorePrep/EnsurePod5' version: '4.015' - class: Pod::Weaver::Plugin::H1Nester name: '@CorePrep/H1Nester' version: '4.015' - class: Pod::Weaver::Section::Generic name: '@SHLOMIF/Name' version: '4.015' - class: Pod::Weaver::Section::Version name: '@SHLOMIF/Version' version: '4.015' - class: Pod::Weaver::Section::Region name: '@SHLOMIF/Prelude' version: '4.015' - class: Pod::Weaver::Section::Generic name: '@SHLOMIF/Synopsis' version: '4.015' - class: Pod::Weaver::Section::Generic name: '@SHLOMIF/Description' version: '4.015' - class: Pod::Weaver::Section::Generic name: '@SHLOMIF/Usage' version: '4.015' - class: Pod::Weaver::Section::Generic name: '@SHLOMIF/Overview' version: '4.015' - class: Pod::Weaver::Section::Generic name: '@SHLOMIF/Stability' version: '4.015' - class: Pod::Weaver::Section::Collect name: Requirements version: '4.015' - class: Pod::Weaver::Section::Collect name: Attributes version: '4.015' - class: Pod::Weaver::Section::Collect name: Constructors version: '4.015' - class: Pod::Weaver::Section::Collect name: Methods version: '4.015' - class: Pod::Weaver::Section::Collect name: Functions version: '4.015' - class: Pod::Weaver::Section::Leftovers name: '@SHLOMIF/Leftovers' version: '4.015' - class: Pod::Weaver::Section::Region name: '@SHLOMIF/postlude' version: '4.015' - class: Pod::Weaver::Section::Support name: '@SHLOMIF/Support' version: '1.013' - class: Pod::Weaver::Section::Authors name: '@SHLOMIF/Authors' version: '4.015' - class: Pod::Weaver::Section::Bugs name: '@SHLOMIF/Bugs' version: '4.015' - class: Pod::Weaver::Section::Contributors name: '@SHLOMIF/Contributors' version: '0.009' - class: Pod::Weaver::Section::Legal name: '@SHLOMIF/Legal' version: '4.015' - class: Pod::Weaver::Plugin::Transformer name: '@SHLOMIF/List' version: '4.015' name: '@Filter/PodWeaver' version: '4.008' - class: Dist::Zilla::Plugin::UploadToCPAN name: '@Filter/UploadToCPAN' version: '6.015' - class: Dist::Zilla::Plugin::Test::Kwalitee config: Dist::Zilla::Plugin::Test::Kwalitee: filename: xt/release/kwalitee.t skiptest: [] name: Test::Kwalitee version: '2.12' - class: Dist::Zilla::Plugin::Test::TidyAll name: Test::TidyAll version: '0.04' - class: Dist::Zilla::Plugin::FinderCode name: ':InstallModules' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':IncModules' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':TestFiles' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':ExtraTestFiles' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':ExecFiles' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':PerlExecFiles' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':ShareFiles' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':MainModule' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':AllFiles' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: ':NoFiles' version: '6.015' - class: Dist::Zilla::Plugin::FinderCode name: '@Filter/MetaProvides::Package/AUTOVIV/:InstallModulesPM' version: '6.015' zilla: class: Dist::Zilla::Dist::Builder config: is_trial: '0' version: '6.015' x_generated_by_perl: v5.32.0 x_serialization_backend: 'YAML::Tiny version 1.73' x_spdx_expression: MIT MANIFEST100644001750001750 74113743057066 15677 0ustar00shlomifshlomif000000000000Object-Declare-0.25# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.015. Build.PL Changes Changes~ LICENSE MANIFEST META.json META.yml Makefile.PL README README.md dist.ini dist.ini~ lib/Object/Declare.pm lib/Object/Declare.pm~ t/00-compile.t t/01-basic.t t/01-basic.t~ weaver.ini weaver.ini~ xt/author/eol.t xt/author/no-tabs.t xt/author/pod-coverage.t xt/author/pod-syntax.t xt/author/tidyall.t xt/release/cpan-changes.t xt/release/kwalitee.t xt/release/trailing-space.t Build.PL100644001750001750 235013743057066 16060 0ustar00shlomifshlomif000000000000Object-Declare-0.25 # This file was automatically generated by Dist::Zilla::Plugin::ModuleBuild v6.015. use strict; use warnings; use Module::Build 0.28; my %module_build_args = ( "build_requires" => { "Module::Build" => "0.28" }, "configure_requires" => { "ExtUtils::MakeMaker" => 0, "Module::Build" => "0.28" }, "dist_abstract" => "Declarative object constructor", "dist_author" => [ "Shlomi Fish " ], "dist_name" => "Object-Declare", "dist_version" => "0.25", "license" => "mit", "module_name" => "Object::Declare", "recursive_test_files" => 1, "requires" => { "overload" => 0, "perl" => "5.006", "strict" => 0, "warnings" => 0 }, "test_requires" => { "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Test::More" => "0.88", "ok" => 0 } ); my %fallback_build_requires = ( "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Module::Build" => "0.28", "Test::More" => "0.88", "ok" => 0 ); unless ( eval { Module::Build->VERSION(0.4004) } ) { delete $module_build_args{test_requires}; $module_build_args{build_requires} = \%fallback_build_requires; } my $build = Module::Build->new(%module_build_args); $build->create_build_script; README.md100644001750001750 14713743057066 16025 0ustar00shlomifshlomif000000000000Object-Declare-0.25Sources for [Object-Declare](https://metacpan.org/release/Object-Declare) , originally by Audrey Tang. dist.ini~100644001750001750 43113743057066 16404 0ustar00shlomifshlomif000000000000Object-Declare-0.25name = Object-Declare author = Shlomi Fish license = MIT copyright_holder = Audrey Tang copyright_year = 2006 version = 0.24 [@Filter] -bundle = @SHLOMIF -remove = License dist = Object-Declare github_name = perl-Object-Declare [Test::Kwalitee] [Test::TidyAll] META.json100644001750001750 4415113743057066 16232 0ustar00shlomifshlomif000000000000Object-Declare-0.25{ "abstract" : "Declarative object constructor", "author" : [ "Shlomi Fish " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.015, CPAN::Meta::Converter version 2.150010", "license" : [ "mit" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Object-Declare", "prereqs" : { "build" : { "requires" : { "Module::Build" : "0.28" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0", "Module::Build" : "0.28" } }, "develop" : { "requires" : { "Pod::Coverage::TrustPod" : "0", "Test::CPAN::Changes" : "0.19", "Test::Code::TidyAll" : "0.50", "Test::EOL" : "0", "Test::Kwalitee" : "1.21", "Test::More" : "0.96", "Test::NoTabs" : "0", "Test::Pod" : "1.41", "Test::Pod::Coverage" : "1.08", "Test::TrailingSpace" : "0.0203" } }, "runtime" : { "requires" : { "overload" : "0", "perl" : "5.006", "strict" : "0", "warnings" : "0" } }, "test" : { "requires" : { "File::Spec" : "0", "IO::Handle" : "0", "IPC::Open3" : "0", "Test::More" : "0.88", "ok" : "0" } } }, "provides" : { "Object::Declare" : { "file" : "lib/Object/Declare.pm", "version" : "0.25" }, "Object::Declare::Katamari" : { "file" : "lib/Object/Declare.pm", "version" : "0.25" } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/shlomif/perl-Object-Declare/issues" }, "homepage" : "http://metacpan.org/release/Object-Declare", "repository" : { "type" : "git", "url" : "git://github.com/shlomif/perl-Object-Declare.git", "web" : "https://github.com/shlomif/perl-Object-Declare" } }, "version" : "0.25", "x_Dist_Zilla" : { "perl" : { "version" : "5.032000" }, "plugins" : [ { "class" : "Dist::Zilla::Plugin::Prereqs", "config" : { "Dist::Zilla::Plugin::Prereqs" : { "phase" : "test", "type" : "requires" } }, "name" : "@Filter/TestMoreDoneTesting", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::AutoPrereqs", "name" : "@Filter/AutoPrereqs", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::ExecDir", "name" : "@Filter/ExecDir", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::GatherDir", "config" : { "Dist::Zilla::Plugin::GatherDir" : { "exclude_filename" : [], "exclude_match" : [], "follow_symlinks" : 0, "include_dotfiles" : 0, "prefix" : "", "prune_directory" : [], "root" : "." } }, "name" : "@Filter/GatherDir", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::ManifestSkip", "name" : "@Filter/ManifestSkip", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::MetaYAML", "name" : "@Filter/MetaYAML", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::PruneCruft", "name" : "@Filter/PruneCruft", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::Readme", "name" : "@Filter/Readme", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::RunExtraTests", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "9" } }, "name" : "@Filter/RunExtraTests", "version" : "0.029" }, { "class" : "Dist::Zilla::Plugin::ShareDir", "name" : "@Filter/ShareDir", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::MakeMaker", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "9" } }, "name" : "@Filter/MakeMaker", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::CheckChangesHasContent", "name" : "@Filter/CheckChangesHasContent", "version" : "0.011" }, { "class" : "Dist::Zilla::Plugin::ConfirmRelease", "name" : "@Filter/ConfirmRelease", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::Manifest", "name" : "@Filter/Manifest", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::MetaConfig", "name" : "@Filter/MetaConfig", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::MetaJSON", "name" : "@Filter/MetaJSON", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::MetaProvides::Package", "config" : { "Dist::Zilla::Plugin::MetaProvides::Package" : { "finder_objects" : [ { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@Filter/MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "6.015" } ], "include_underscores" : 0 }, "Dist::Zilla::Role::MetaProvider::Provider" : { "$Dist::Zilla::Role::MetaProvider::Provider::VERSION" : "2.002004", "inherit_missing" : 1, "inherit_version" : 1, "meta_noindex" : 1 }, "Dist::Zilla::Role::ModuleMetadata" : { "Module::Metadata" : "1.000037", "version" : "0.006" } }, "name" : "@Filter/MetaProvides::Package", "version" : "2.004003" }, { "class" : "Dist::Zilla::Plugin::MetaResources", "name" : "@Filter/MetaResources", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::ModuleBuild", "config" : { "Dist::Zilla::Role::TestRunner" : { "default_jobs" : "9" } }, "name" : "@Filter/ModuleBuild", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::PkgVersion", "name" : "@Filter/PkgVersion", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::PodCoverageTests", "name" : "@Filter/PodCoverageTests", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::PodSyntaxTests", "name" : "@Filter/PodSyntaxTests", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::Test::Compile", "config" : { "Dist::Zilla::Plugin::Test::Compile" : { "bail_out_on_fail" : 0, "fail_on_warning" : "author", "fake_home" : 0, "filename" : "t/00-compile.t", "module_finder" : [ ":InstallModules" ], "needs_display" : 0, "phase" : "test", "script_finder" : [ ":PerlExecFiles" ], "skips" : [], "switch" : [] } }, "name" : "@Filter/Test::Compile", "version" : "2.058" }, { "class" : "Dist::Zilla::Plugin::Test::CPAN::Changes", "config" : { "Dist::Zilla::Plugin::Test::CPAN::Changes" : { "changelog" : "Changes" } }, "name" : "@Filter/Test::CPAN::Changes", "version" : "0.012" }, { "class" : "Dist::Zilla::Plugin::Test::EOL", "config" : { "Dist::Zilla::Plugin::Test::EOL" : { "filename" : "xt/author/eol.t", "finder" : [ ":ExecFiles", ":InstallModules", ":TestFiles" ], "trailing_whitespace" : 1 } }, "name" : "@Filter/Test::EOL", "version" : "0.19" }, { "class" : "Dist::Zilla::Plugin::Test::NoTabs", "config" : { "Dist::Zilla::Plugin::Test::NoTabs" : { "filename" : "xt/author/no-tabs.t", "finder" : [ ":InstallModules", ":ExecFiles", ":TestFiles" ] } }, "name" : "@Filter/Test::NoTabs", "version" : "0.15" }, { "class" : "Dist::Zilla::Plugin::Test::TrailingSpace", "name" : "@Filter/Test::TrailingSpace", "version" : "0.2.0" }, { "class" : "Dist::Zilla::Plugin::TestRelease", "name" : "@Filter/TestRelease", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::PodWeaver", "config" : { "Dist::Zilla::Plugin::PodWeaver" : { "finder" : [ ":InstallModules", ":ExecFiles" ], "plugins" : [ { "class" : "Pod::Weaver::Plugin::SingleEncoding", "name" : "@SHLOMIF/SingleEncoding", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::WikiDoc", "name" : "@SHLOMIF/WikiDoc", "version" : "0.093004" }, { "class" : "Pod::Weaver::Plugin::EnsurePod5", "name" : "@CorePrep/EnsurePod5", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::H1Nester", "name" : "@CorePrep/H1Nester", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@SHLOMIF/Name", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Version", "name" : "@SHLOMIF/Version", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@SHLOMIF/Prelude", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@SHLOMIF/Synopsis", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@SHLOMIF/Description", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@SHLOMIF/Usage", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@SHLOMIF/Overview", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Generic", "name" : "@SHLOMIF/Stability", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "Requirements", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "Attributes", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "Constructors", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "Methods", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Collect", "name" : "Functions", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Leftovers", "name" : "@SHLOMIF/Leftovers", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Region", "name" : "@SHLOMIF/postlude", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Support", "name" : "@SHLOMIF/Support", "version" : "1.013" }, { "class" : "Pod::Weaver::Section::Authors", "name" : "@SHLOMIF/Authors", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Bugs", "name" : "@SHLOMIF/Bugs", "version" : "4.015" }, { "class" : "Pod::Weaver::Section::Contributors", "name" : "@SHLOMIF/Contributors", "version" : "0.009" }, { "class" : "Pod::Weaver::Section::Legal", "name" : "@SHLOMIF/Legal", "version" : "4.015" }, { "class" : "Pod::Weaver::Plugin::Transformer", "name" : "@SHLOMIF/List", "version" : "4.015" } ] } }, "name" : "@Filter/PodWeaver", "version" : "4.008" }, { "class" : "Dist::Zilla::Plugin::UploadToCPAN", "name" : "@Filter/UploadToCPAN", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::Test::Kwalitee", "config" : { "Dist::Zilla::Plugin::Test::Kwalitee" : { "filename" : "xt/release/kwalitee.t", "skiptest" : [] } }, "name" : "Test::Kwalitee", "version" : "2.12" }, { "class" : "Dist::Zilla::Plugin::Test::TidyAll", "name" : "Test::TidyAll", "version" : "0.04" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":InstallModules", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":IncModules", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":TestFiles", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExtraTestFiles", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ExecFiles", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":PerlExecFiles", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":ShareFiles", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":MainModule", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":AllFiles", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : ":NoFiles", "version" : "6.015" }, { "class" : "Dist::Zilla::Plugin::FinderCode", "name" : "@Filter/MetaProvides::Package/AUTOVIV/:InstallModulesPM", "version" : "6.015" } ], "zilla" : { "class" : "Dist::Zilla::Dist::Builder", "config" : { "is_trial" : 0 }, "version" : "6.015" } }, "x_generated_by_perl" : "v5.32.0", "x_serialization_backend" : "Cpanel::JSON::XS version 4.24", "x_spdx_expression" : "MIT" } weaver.ini100644001750001750 1313743057066 16510 0ustar00shlomifshlomif000000000000Object-Declare-0.25[@SHLOMIF] weaver.ini~100644001750001750 64213743057066 16736 0ustar00shlomifshlomif000000000000Object-Declare-0.25[@CorePrep] [Generic / NAME] [Version] [Region / prelude] [Generic / SYNOPSIS] [Generic / DESCRIPTION] [Generic / OVERVIEW] [Collect / ATTRIBUTES] command = attr [Collect / METHODS] command = method [Leftovers] [Region / postlude] [Authors] [Legal] ; [Generic / DESCRIPTION] ; required = 1 ; [Generic / BUGS] ; [Generic / Section::Bugs] ; [Generic / Section::License] ; [Bugs] [Support] all_modules = 1 Makefile.PL100644001750001750 256113743057066 16542 0ustar00shlomifshlomif000000000000Object-Declare-0.25# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.015. use strict; use warnings; use 5.006; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Declarative object constructor", "AUTHOR" => "Shlomi Fish ", "BUILD_REQUIRES" => { "Module::Build" => "0.28" }, "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0, "Module::Build" => "0.28" }, "DISTNAME" => "Object-Declare", "LICENSE" => "mit", "MIN_PERL_VERSION" => "5.006", "NAME" => "Object::Declare", "PREREQ_PM" => { "overload" => 0, "strict" => 0, "warnings" => 0 }, "TEST_REQUIRES" => { "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Test::More" => "0.88", "ok" => 0 }, "VERSION" => "0.25", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "File::Spec" => 0, "IO::Handle" => 0, "IPC::Open3" => 0, "Module::Build" => "0.28", "Test::More" => "0.88", "ok" => 0, "overload" => 0, "strict" => 0, "warnings" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); t000755001750001750 013743057066 14667 5ustar00shlomifshlomif000000000000Object-Declare-0.2501-basic.t100644001750001750 431113743057066 16512 0ustar00shlomifshlomif000000000000Object-Declare-0.25/tuse strict; use warnings; use Test::More tests => 3, import => ['is_deeply']; # TEST use ok 'Object::Declare' => copula => { is => '', are => 'plural_', }, aliases => { field2 => 'fun', }, mapping => { column => 'MyApp::Column', alt_col => sub { return { alt => column(), @_ } } }; sub column { 1 } sub MyApp::Column::new { shift; return {@_} } sub do_declare { declare { column x => is rw, is Very::Happy, field1 is 'xxx', field2 are 'XXX', 'XXX', is field3, parts are column( is happy ), column( !is happy ); alt_col y => !is Very::Happy, field1 is 'yyy', field2 is 'YYY', col is column( is happy ); } } my @objects = do_declare; # TEST is_deeply( \@objects => [ x => { 'name' => 'x', 'field1' => 'xxx', 'plural_field2' => [ 'XXX', 'XXX' ], 'plural_parts' => [ { happy => 1 }, { happy => '' }, ], 'field3' => 1, 'rw' => 1, 'Very::Happy' => 1, }, y => { 'name' => 'y', 'field1' => 'yyy', 'fun' => 'YYY', 'alt' => 1, col => { 'name' => 'col', 'happy' => 1, }, 'Very::Happy' => '', }, ], 'object declared correctly (list context)' ); my $objects = do_declare; # TEST is_deeply( $objects => { x => { 'name' => 'x', 'field1' => 'xxx', 'plural_field2' => [ 'XXX', 'XXX' ], 'plural_parts' => [ { happy => 1 }, { happy => '' }, ], 'field3' => 1, 'rw' => 1, 'Very::Happy' => 1, }, y => { 'name' => 'y', 'field1' => 'yyy', 'fun' => 'YYY', 'alt' => 1, col => { 'name' => 'col', 'happy' => 1, }, 'Very::Happy' => '', }, }, 'object declared correctly (scalar context)' ); 01-basic.t~100644001750001750 431113743057066 16710 0ustar00shlomifshlomif000000000000Object-Declare-0.25/tuse strict; use warnings; use Test::More tests => 3, import => ['is_deeply']; # TEST use ok 'Object::Declare' => copula => { is => '', are => 'plural_', }, aliases => { field2 => 'fun', }, mapping => { column => 'MyApp::Column', alt_col => sub { return { alt => column(), @_ } } }; sub column { 1 } sub MyApp::Column::new { shift; return {@_} } sub do_declare { declare { column x => is rw, is Very::Happy, field1 is 'xxx', field2 are 'XXX', 'XXX', is field3, parts are column( is happy ), column( !is happy ); alt_col y => !is Very::Happy, field1 is 'yyy', field2 is 'YYY', col is column( is happy ); } } my @objects = do_declare; # TEST is_deeply( \@objects => [ x => { 'name' => 'x', 'field1' => 'xxx', 'plural_field2' => [ 'XXX', 'XXX' ], 'plural_parts' => [ { happy => 1 }, { happy => '' }, ], 'field3' => 1, 'rw' => 1, 'Very::Happy' => 1, }, y => { 'name' => 'y', 'field1' => 'yyy', 'fun' => 'YYY', 'alt' => 1, col => { 'name' => 'col', 'happy' => 1, }, 'Very::Happy' => '', }, ], 'object declared correctly (list context)' ); my $objects = do_declare; # TEST is_deeply( $objects => { x => { 'name' => 'x', 'field1' => 'xxx', 'plural_field2' => [ 'XXX', 'XXX' ], 'plural_parts' => [ { happy => 1 }, { happy => '' }, ], 'field3' => 1, 'rw' => 1, 'Very::Happy' => 1, }, y => { 'name' => 'y', 'field1' => 'yyy', 'fun' => 'YYY', 'alt' => 1, col => { 'name' => 'col', 'happy' => 1, }, 'Very::Happy' => '', }, }, 'object declared correctly (scalar context)' ); 00-compile.t100644001750001750 263713743057066 17071 0ustar00shlomifshlomif000000000000Object-Declare-0.25/tuse 5.006; use strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::Compile 2.058 use Test::More; plan tests => 1 + ($ENV{AUTHOR_TESTING} ? 1 : 0); my @module_files = ( 'Object/Declare.pm' ); # no fake home requested my @switches = ( -d 'blib' ? '-Mblib' : '-Ilib', ); use File::Spec; use IPC::Open3; use IO::Handle; open my $stdin, '<', File::Spec->devnull or die "can't open devnull: $!"; my @warnings; for my $lib (@module_files) { # see L my $stderr = IO::Handle->new; diag('Running: ', join(', ', map { my $str = $_; $str =~ s/'/\\'/g; q{'} . $str . q{'} } $^X, @switches, '-e', "require q[$lib]")) if $ENV{PERL_COMPILE_TEST_DEBUG}; my $pid = open3($stdin, '>&STDERR', $stderr, $^X, @switches, '-e', "require q[$lib]"); binmode $stderr, ':crlf' if $^O eq 'MSWin32'; my @_warnings = <$stderr>; waitpid($pid, 0); is($?, 0, "$lib loaded ok"); shift @_warnings if @_warnings and $_warnings[0] =~ /^Using .*\bblib/ and not eval { +require blib; blib->VERSION('1.01') }; if (@_warnings) { warn @_warnings; push @warnings, @_warnings; } } is(scalar(@warnings), 0, 'no warnings found') or diag 'got warnings: ', ( Test::More->can('explain') ? Test::More::explain(\@warnings) : join("\n", '', @warnings) ) if $ENV{AUTHOR_TESTING}; author000755001750001750 013743057066 16361 5ustar00shlomifshlomif000000000000Object-Declare-0.25/xteol.t100644001750001750 47513743057066 17453 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/authoruse strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::EOL 0.19 use Test::More 0.88; use Test::EOL; my @files = ( 'lib/Object/Declare.pm', 't/00-compile.t', 't/01-basic.t', 't/01-basic.t~' ); eol_unix_ok($_, { trailing_whitespace => 1 }) foreach @files; done_testing; no-tabs.t100644001750001750 44313743057066 20232 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/authoruse strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::NoTabs 0.15 use Test::More 0.88; use Test::NoTabs; my @files = ( 'lib/Object/Declare.pm', 't/00-compile.t', 't/01-basic.t', 't/01-basic.t~' ); notabs_ok($_) foreach @files; done_testing; tidyall.t100644001750001750 52213743057066 20327 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/author# This file was automatically generated by Dist::Zilla::Plugin::Test::TidyAll v$VERSION use Test::More 0.88; use Test::Code::TidyAll 0.24; tidyall_ok( verbose => ( exists $ENV{TEST_TIDYALL_VERBOSE} ? $ENV{TEST_TIDYALL_VERBOSE} : 0 ), jobs => ( exists $ENV{TEST_TIDYALL_JOBS} ? $ENV{TEST_TIDYALL_JOBS} : 1 ), ); done_testing; Object000755001750001750 013743057066 16400 5ustar00shlomifshlomif000000000000Object-Declare-0.25/libDeclare.pm100644001750001750 3472613743057066 20471 0ustar00shlomifshlomif000000000000Object-Declare-0.25/lib/Objectpackage Object::Declare; use 5.006; use strict; use warnings; our $VERSION = '0.24'; sub import { my $class = shift; my %args = ( ( @_ and ref( $_[0] ) ) ? ( mapping => $_[0] ) : @_ ) or return; my $from = caller; my $mapping = $args{mapping} or return; my $aliases = $args{aliases} || {}; my $declarator = $args{declarator} || ['declare']; my $copula = $args{copula} || [ 'is', 'are' ]; # Both declarator and copula can contain more than one entries; # normalize into an arrayref if we only have on entry. $mapping = [$mapping] unless ref($mapping); $declarator = [$declarator] unless ref($declarator); $copula = [$copula] unless ref($copula); if ( ref($mapping) eq 'ARRAY' ) { # rewrite "MyApp::Foo" into simply "foo" $mapping = { map { my $helper = $_; $helper =~ s/.*:://; ( lc($helper) => $_ ); } @$mapping }; } # Convert mapping targets into instantiation closures if ( ref($mapping) eq 'HASH' ) { foreach my $key ( keys %$mapping ) { my $val = $mapping->{$key}; next if ref($val); # already a callback, don't bother $mapping->{$key} = sub { scalar( $val->new(@_) ) }; } } if ( ref($copula) eq 'ARRAY' ) { # add an empty prefix to all copula $copula = { map { $_ => '' } @$copula }; } # Install declarator functions into caller's package, remembering # the mapping and copula set for this declarator. foreach my $sym (@$declarator) { ## no critic (ProhibitNoStrict) no strict 'refs'; *{"$from\::$sym"} = sub (&) { unshift @_, ( $mapping, $copula, $aliases ); goto &_declare; }; ## use critic } # Establish prototypes (same as "use subs") so Sub::Override can work { ## no critic (ProhibitNoStrict) no strict 'refs'; _predeclare( ( map { "$from\::$_" } keys %$mapping ), ( map { ( "UNIVERSAL::$_", "$_\::AUTOLOAD" ) } keys %$copula ), ); ## use critic } } # Same as "use sub". All is fair if you predeclare. sub _predeclare { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; foreach my $sym (@_) { *$sym = \&$sym; } ## use critic } sub _declare { my ( $mapping, $copula, $aliases, $code ) = @_; my $from = caller; # Table of collected objects. my @objects; # Establish a lexical extent for overrided symbols; they will be # restored automagically upon scope exit. my %subs_replaced; my $replace = sub { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; my ( $sym, $code ) = @_; # Do the "use subs" predeclaration again before overriding, because # Sub::Override cannot handle empty symbol slots. This is normally # redundant (&import already did that), but we do it here anyway to # guard against runtime deletion of symbol table entries. _predeclare($sym); # Now replace the symbol for real. $subs_replaced{$sym} ||= *$sym{CODE}; *$sym = $code; ## use critic }; # In DSL (domain-specific language) mode; install AUTOLOAD to handle all # unrecognized calls for "foo is 1" (which gets translated to "is->foo(1)", # and UNIVERSAL to collect "is foo" (which gets translated to "foo->is". # The arguments are rolled into a Katamari structure for later analysis. while ( my ( $sym, $prefix ) = each %$copula ) { $replace->( "UNIVERSAL::$sym" => sub { # Turn "is some_field" into "some_field is 1" my ( $key, @vals ) = ref($prefix) ? $prefix->(@_) : ( $prefix . $_[0] => 1 ) or return; # If the copula returns a ready-to-use katamari object, # don't try to roll it by ourself. return $key if ref($key) && ref($key) eq 'Object::Declare::Katamari'; $key = $aliases->{$key} if $aliases and exists $aliases->{$key}; unshift @vals, $key; bless( \@vals => 'Object::Declare::Katamari' ); } ); $replace->( "$sym\::AUTOLOAD" => sub { # Handle "some_field is $some_value" shift; my $field = our $AUTOLOAD; return if $field =~ /DESTROY$/; $field =~ s/^\Q$sym\E:://; my ( $key, @vals ) = ref($prefix) ? $prefix->( $field, @_ ) : ( $prefix . $field => @_ ) or return; $key = $aliases->{$key} if $aliases and exists $aliases->{$key}; unshift @vals, $key; bless( \@vals, 'Object::Declare::Katamari' ); } ); } my @overridden = map { "$from\::$_" } keys %$mapping; # Now install the collector symbols from class mappings my $toggle_subs = sub { foreach my $sym (@overridden) { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; ( $subs_replaced{$sym}, *$sym ) = ( *$sym{CODE}, $subs_replaced{$sym} ); ## use critic } }; while ( my ( $sym, $build ) = each %$mapping ) { $replace->( "$from\::$sym" => _make_object( $build => \@objects, $toggle_subs ) ); } # Let's play Katamari! &$code; # Restore overriden subs while ( my ( $sym, $code ) = each %subs_replaced ) { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; *$sym = $code; ## use critic } # In scalar context, returns hashref; otherwise preserve ordering return ( wantarray ? @objects : {@objects} ); } # Make a star from the Katamari! sub _make_object { my ( $build, $schema, $toggle_subs ) = @_; return sub { # Restore overriden subs ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; ## use critic my $name = ( ref( $_[0] ) ? undef : shift ); my $args = \@_; my $damacy = bless( sub { $toggle_subs->(); my $rv = $build->( ( $_[0] ? ( name => $_[0] ) : () ), map { $_->unroll } @$args ); $toggle_subs->(); return $rv; } => 'Object::Declare::Damacy' ); if (wantarray) { return ($damacy); } else { push @$schema, $name => $damacy->($name); } }; } package Object::Declare::Katamari; use overload "!" => \&negation, fallback => 1; sub negation { my @katamari = @{ $_[0] } or return (); $katamari[1] = !$katamari[1]; return bless( \@katamari, ref( $_[0] ) ); } # Unroll a Katamari structure into constructor arguments. sub unroll { my @katamari = @{ $_[0] } or return (); my $field = shift @katamari or return (); my @unrolled; unshift @unrolled, pop(@katamari)->unroll while ref( $katamari[-1] ) eq __PACKAGE__; if ( @katamari == 1 ) { # single value: "is foo" if ( ref( $katamari[0] ) eq 'Object::Declare::Damacy' ) { $katamari[0] = $katamari[0]->($field); } return ( $field => @katamari, @unrolled ); } else { # Multiple values: "are qw( foo bar baz )" foreach my $kata (@katamari) { $kata = $kata->() if ref($kata) eq 'Object::Declare::Damacy'; } return ( $field => \@katamari, @unrolled ); } } 1; __END__ =pod =encoding UTF-8 =head1 NAME Object::Declare - Declarative object constructor =head1 VERSION version 0.25 =head1 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 =head1 DESCRIPTION This module exports one function, C, for building named objects with a declarative syntax, similar to how L defines its columns. In list context, C returns a list of name/object pairs in the order of declaration (allowing duplicates), suitable for putting into a hash. In scalar context, C returns a hash reference. Using a flexible C interface, one can change exported helper functions names (I), words to link labels and values together (I), and the table of named classes to declare (I): 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 C<&is> and C<&are>) that existed before the declarator's execution are restored correctly. =head1 NOTES If you export the declarator to another package via C<@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. =head1 AUTHORS Audrey Tang Ecpan@audreyt.orgE =head1 COPYRIGHT Copyright 2006, 2007 by Audrey Tang . This software is released under the MIT license cited below. =head2 The "MIT" License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. =for :stopwords cpan testmatrix url bugtracker rt cpants kwalitee diff irc mailto metadata placeholders metacpan =head1 SUPPORT =head2 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. =over 4 =item * MetaCPAN A modern, open-source CPAN search engine, useful to view POD in HTML format. L =item * RT: CPAN's Bug Tracker The RT ( Request Tracker ) website is the default bug/issue tracking system for CPAN. L =item * CPANTS The CPANTS is a website that analyzes the Kwalitee ( code metrics ) of a distribution. L =item * CPAN Testers The CPAN Testers is a network of smoke testers who run automated tests on uploaded CPAN distributions. L =item * 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. L =item * CPAN Testers Dependencies The CPAN Testers Dependencies is a website that shows a chart of the test results of all dependencies for a distribution. L =back =head2 Bugs / Feature Requests Please report any bugs or feature requests by email to C, or through the web interface at L. You will be automatically notified of any progress on the request by the system. =head2 Source Code 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 :) L git clone git://github.com/shlomif/perl-Object-Declare.git =head1 AUTHOR Shlomi Fish =head1 BUGS Please report any bugs or feature requests on the bugtracker website L 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. =head1 COPYRIGHT AND LICENSE This software is Copyright (c) 2006 by Audrey Tang. This is free software, licensed under: The MIT (X11) License =cut release000755001750001750 013743057066 16477 5ustar00shlomifshlomif000000000000Object-Declare-0.25/xtkwalitee.t100644001750001750 27513743057066 20615 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/release# this test was generated with Dist::Zilla::Plugin::Test::Kwalitee 2.12 use strict; use warnings; use Test::More 0.88; use Test::Kwalitee 1.21 'kwalitee_ok'; kwalitee_ok(); done_testing; Declare.pm~100644001750001750 2754113743057066 20664 0ustar00shlomifshlomif000000000000Object-Declare-0.25/lib/Objectpackage Object::Declare; use 5.006; use strict; use warnings; our $VERSION = '0.24'; sub import { my $class = shift; my %args = ( ( @_ and ref( $_[0] ) ) ? ( mapping => $_[0] ) : @_ ) or return; my $from = caller; my $mapping = $args{mapping} or return; my $aliases = $args{aliases} || {}; my $declarator = $args{declarator} || ['declare']; my $copula = $args{copula} || [ 'is', 'are' ]; # Both declarator and copula can contain more than one entries; # normalize into an arrayref if we only have on entry. $mapping = [$mapping] unless ref($mapping); $declarator = [$declarator] unless ref($declarator); $copula = [$copula] unless ref($copula); if ( ref($mapping) eq 'ARRAY' ) { # rewrite "MyApp::Foo" into simply "foo" $mapping = { map { my $helper = $_; $helper =~ s/.*:://; ( lc($helper) => $_ ); } @$mapping }; } # Convert mapping targets into instantiation closures if ( ref($mapping) eq 'HASH' ) { foreach my $key ( keys %$mapping ) { my $val = $mapping->{$key}; next if ref($val); # already a callback, don't bother $mapping->{$key} = sub { scalar( $val->new(@_) ) }; } } if ( ref($copula) eq 'ARRAY' ) { # add an empty prefix to all copula $copula = { map { $_ => '' } @$copula }; } # Install declarator functions into caller's package, remembering # the mapping and copula set for this declarator. foreach my $sym (@$declarator) { ## no critic (ProhibitNoStrict) no strict 'refs'; *{"$from\::$sym"} = sub (&) { unshift @_, ( $mapping, $copula, $aliases ); goto &_declare; }; ## use critic } # Establish prototypes (same as "use subs") so Sub::Override can work { ## no critic (ProhibitNoStrict) no strict 'refs'; _predeclare( ( map { "$from\::$_" } keys %$mapping ), ( map { ( "UNIVERSAL::$_", "$_\::AUTOLOAD" ) } keys %$copula ), ); ## use critic } } # Same as "use sub". All is fair if you predeclare. sub _predeclare { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; foreach my $sym (@_) { *$sym = \&$sym; } ## use critic } sub _declare { my ( $mapping, $copula, $aliases, $code ) = @_; my $from = caller; # Table of collected objects. my @objects; # Establish a lexical extent for overrided symbols; they will be # restored automagically upon scope exit. my %subs_replaced; my $replace = sub { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; my ( $sym, $code ) = @_; # Do the "use subs" predeclaration again before overriding, because # Sub::Override cannot handle empty symbol slots. This is normally # redundant (&import already did that), but we do it here anyway to # guard against runtime deletion of symbol table entries. _predeclare($sym); # Now replace the symbol for real. $subs_replaced{$sym} ||= *$sym{CODE}; *$sym = $code; ## use critic }; # In DSL (domain-specific language) mode; install AUTOLOAD to handle all # unrecognized calls for "foo is 1" (which gets translated to "is->foo(1)", # and UNIVERSAL to collect "is foo" (which gets translated to "foo->is". # The arguments are rolled into a Katamari structure for later analysis. while ( my ( $sym, $prefix ) = each %$copula ) { $replace->( "UNIVERSAL::$sym" => sub { # Turn "is some_field" into "some_field is 1" my ( $key, @vals ) = ref($prefix) ? $prefix->(@_) : ( $prefix . $_[0] => 1 ) or return; # If the copula returns a ready-to-use katamari object, # don't try to roll it by ourself. return $key if ref($key) && ref($key) eq 'Object::Declare::Katamari'; $key = $aliases->{$key} if $aliases and exists $aliases->{$key}; unshift @vals, $key; bless( \@vals => 'Object::Declare::Katamari' ); } ); $replace->( "$sym\::AUTOLOAD" => sub { # Handle "some_field is $some_value" shift; my $field = our $AUTOLOAD; return if $field =~ /DESTROY$/; $field =~ s/^\Q$sym\E:://; my ( $key, @vals ) = ref($prefix) ? $prefix->( $field, @_ ) : ( $prefix . $field => @_ ) or return; $key = $aliases->{$key} if $aliases and exists $aliases->{$key}; unshift @vals, $key; bless( \@vals, 'Object::Declare::Katamari' ); } ); } my @overridden = map { "$from\::$_" } keys %$mapping; # Now install the collector symbols from class mappings my $toggle_subs = sub { foreach my $sym (@overridden) { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; ( $subs_replaced{$sym}, *$sym ) = ( *$sym{CODE}, $subs_replaced{$sym} ); ## use critic } }; while ( my ( $sym, $build ) = each %$mapping ) { $replace->( "$from\::$sym" => _make_object( $build => \@objects, $toggle_subs ) ); } # Let's play Katamari! &$code; # Restore overriden subs while ( my ( $sym, $code ) = each %subs_replaced ) { ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; *$sym = $code; ## use critic } # In scalar context, returns hashref; otherwise preserve ordering return ( wantarray ? @objects : {@objects} ); } # Make a star from the Katamari! sub _make_object { my ( $build, $schema, $toggle_subs ) = @_; return sub { # Restore overriden subs ## no critic (ProhibitNoStrict) no strict 'refs'; no warnings 'redefine'; ## use critic my $name = ( ref( $_[0] ) ? undef : shift ); my $args = \@_; my $damacy = bless( sub { $toggle_subs->(); my $rv = $build->( ( $_[0] ? ( name => $_[0] ) : () ), map { $_->unroll } @$args ); $toggle_subs->(); return $rv; } => 'Object::Declare::Damacy' ); if (wantarray) { return ($damacy); } else { push @$schema, $name => $damacy->($name); } }; } package Object::Declare::Katamari; use overload "!" => \&negation, fallback => 1; sub negation { my @katamari = @{ $_[0] } or return (); $katamari[1] = !$katamari[1]; return bless( \@katamari, ref( $_[0] ) ); } # Unroll a Katamari structure into constructor arguments. sub unroll { my @katamari = @{ $_[0] } or return (); my $field = shift @katamari or return (); my @unrolled; unshift @unrolled, pop(@katamari)->unroll while ref( $katamari[-1] ) eq __PACKAGE__; if ( @katamari == 1 ) { # single value: "is foo" if ( ref( $katamari[0] ) eq 'Object::Declare::Damacy' ) { $katamari[0] = $katamari[0]->($field); } return ( $field => @katamari, @unrolled ); } else { # Multiple values: "are qw( foo bar baz )" foreach my $kata (@katamari) { $kata = $kata->() if ref($kata) eq 'Object::Declare::Damacy'; } return ( $field => \@katamari, @unrolled ); } } 1; __END__ =head1 NAME Object::Declare - Declarative object constructor =head1 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 =head1 DESCRIPTION This module exports one function, C, for building named objects with a declarative syntax, similar to how L defines its columns. In list context, C returns a list of name/object pairs in the order of declaration (allowing duplicates), suitable for putting into a hash. In scalar context, C returns a hash reference. Using a flexible C interface, one can change exported helper functions names (I), words to link labels and values together (I), and the table of named classes to declare (I): 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 C<&is> and C<&are>) that existed before the declarator's execution are restored correctly. =head1 NOTES If you export the declarator to another package via C<@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. =head1 AUTHORS Audrey Tang Ecpan@audreyt.orgE =head1 COPYRIGHT Copyright 2006, 2007 by Audrey Tang . This software is released under the MIT license cited below. =head2 The "MIT" License Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. =cut pod-syntax.t100644001750001750 25213743057066 20773 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/author#!perl # This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests. use strict; use warnings; use Test::More; use Test::Pod 1.41; all_pod_files_ok(); pod-coverage.t100644001750001750 33413743057066 21241 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/author#!perl # This file was automatically generated by Dist::Zilla::Plugin::PodCoverageTests. use Test::Pod::Coverage 1.08; use Pod::Coverage::TrustPod; all_pod_coverage_ok({ coverage_class => 'Pod::Coverage::TrustPod' }); cpan-changes.t100644001750001750 34413743057066 21334 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/releaseuse strict; use warnings; # this test was generated with Dist::Zilla::Plugin::Test::CPAN::Changes 0.012 use Test::More 0.96 tests => 1; use Test::CPAN::Changes; subtest 'changes_ok' => sub { changes_file_ok('Changes'); }; trailing-space.t100644001750001750 103413743057066 21724 0ustar00shlomifshlomif000000000000Object-Declare-0.25/xt/release#!perl use strict; use warnings; use Test::More; eval "use Test::TrailingSpace"; if ($@) { plan skip_all => "Test::TrailingSpace required for trailing space test."; } else { plan tests => 1; } # TODO: add .pod, .PL, the README/Changes/TODO/etc. documents and possibly # some other stuff. my $finder = Test::TrailingSpace->new( { root => '.', filename_regex => qr#(?:\.(?:t|pm|pl|xs|c|h|txt|pod|PL)|README|Changes|TODO|LICENSE)\z#, }, ); # TEST $finder->no_trailing_space( "No trailing space was found." );