diff options
Diffstat (limited to 'cpan/Test-Simple/lib/Test/Stream/ArrayBase.pm')
-rw-r--r-- | cpan/Test-Simple/lib/Test/Stream/ArrayBase.pm | 373 |
1 files changed, 0 insertions, 373 deletions
diff --git a/cpan/Test-Simple/lib/Test/Stream/ArrayBase.pm b/cpan/Test-Simple/lib/Test/Stream/ArrayBase.pm deleted file mode 100644 index 6ac75de373..0000000000 --- a/cpan/Test-Simple/lib/Test/Stream/ArrayBase.pm +++ /dev/null @@ -1,373 +0,0 @@ -package Test::Stream::ArrayBase; -use strict; -use warnings; - -use Test::Stream::ArrayBase::Meta; -use Test::Stream::Carp qw/confess croak/; -use Scalar::Util qw/blessed reftype/; - -use Test::Stream::Exporter(); - -sub import { - my $class = shift; - my $caller = caller; - - $class->apply_to($caller, @_); -} - -sub apply_to { - my $class = shift; - my ($caller, %args) = @_; - - # Make the calling class an exporter. - my $exp_meta = Test::Stream::Exporter::Meta->new($caller); - Test::Stream::Exporter->export_to($caller, 'import') - unless $args{no_import}; - - my $ab_meta = Test::Stream::ArrayBase::Meta->new($caller); - - my $ISA = do { no strict 'refs'; \@{"$caller\::ISA"} }; - - if ($args{base}) { - my ($base) = grep { $_->isa($class) } @$ISA; - - croak "$caller is already a subclass of '$base', cannot subclass $args{base}" - if $base; - - my $file = $args{base}; - $file =~ s{::}{/}g; - $file .= ".pm"; - require $file unless $INC{$file}; - - my $pmeta = Test::Stream::ArrayBase::Meta->get($args{base}); - croak "Base class '$args{base}' is not a subclass of $class!" - unless $pmeta; - - push @$ISA => $args{base}; - - $ab_meta->subclass($args{base}); - } - elsif( !grep { $_->isa($class) } @$ISA) { - push @$ISA => $class; - $ab_meta->baseclass(); - } - - $ab_meta->add_accessors(@{$args{accessors}}) - if $args{accessors}; -} - -sub new { - my $class = shift; - my $self = bless [@_], $class; - $self->init if $self->can('init'); - return $self; -} - -sub new_from_pairs { - my $class = shift; - my %params = @_; - my $self = bless [], $class; - - while (my ($k, $v) = each %params) { - my $const = uc($k); - croak "$class has no accessor named '$k'" unless $class->can($const); - my $id = $class->$const; - $self->[$id] = $v; - } - - $self->init if $self->can('init'); - return $self; -} - -sub to_hash { - my $array_obj = shift; - my $meta = Test::Stream::ArrayBase::Meta->get(blessed $array_obj); - my $fields = $meta->fields; - my %out; - for my $f (keys %$fields) { - my $i = $fields->{$f}; - my $val = $array_obj->[$i]; - my $ao = blessed($val) && $val->isa(__PACKAGE__); - $out{$f} = $ao ? $val->to_hash : $val; - } - return \%out; -}; - -1; - -__END__ - -=pod - -=encoding UTF-8 - -=head1 NAME - -Test::Stream::ArrayBase - Base class for classes that use an arrayref instead -of a hash. - -=head1 SYNOPSYS - -A class: - - package My::Class; - use strict; - use warnings; - - use Test::Stream::ArrayBase accessors => [qw/foo bar baz/]; - - # Chance to initialize defaults - sub init { - my $self = shift; # No other args - $self->[FOO] ||= "foo"; - $self->[BAR] ||= "bar"; - $self->[BAZ] ||= "baz"; - } - - sub print { - print join ", " => map { $self->[$_] } FOO, BAR, BAZ; - } - -Subclass it - - package My::Subclass; - use strict; - use warnings; - use Test::Stream::ArrayBase base => 'My::Class', # subclass - accessors => ['bat']; - - sub init { - my $self = shift; - - # We get the constants from the base class for free. - $self->[FOO] ||= 'SubFoo'; - $self->[BAT] || = 'bat'; - - $self->SUPER::init(); - } - -use it: - - package main; - use strict; - use warnings; - use My::Class; - - my $one = My::Class->new('MyFoo', 'MyBar'); - - # Accessors! - my $foo = $one->foo; # 'MyFoo' - my $bar = $one->bar; # 'MyBar' - my $baz = $one->baz; # Defaulted to: 'baz' - - # Setters! - $one->set_foo('A Foo'); - $one->set_bar('A Bar'); - $one->set_baz('A Baz'); - - # It is an arrayref, you can do this! - my ($foo, $bar, $baz) = @$one; - - # import constants: - use My::Class qw/FOO BAR BAZ/; - - $one->[FOO] = 'xxx'; - -=head1 DESCRIPTION - -This package is used to generate classes based on arrays instead of hashes. The -primary motivation for this is performance (not premature!). Using this class -will give you a C<new()> method, as well as generating accessors you request. -Generated accessors will be getters, C<set_ACCESSOR> setters will also be -generated for you. You also get constants for each accessor (all caps) which -return the index into the array for that accessor. Single inheritence is also -supported. For obvious reasons you cannot use multiple inheritence with an -array based object. - -=head1 METHODS - -=head2 PROVIDED BY ARRAY BASE - -=over 4 - -=item $it = $class->new(@VALUES) - -Create a new instance from a list of ordered values. - -=item $it = $class->new_from_pairs(%ACCESSOR_VAL_PAIRS) - -Create a new instance using key/value pairs. - -=item $hr = $it->to_hash() - -Get a hashref dump of the object. This will also dump any ArrayBase objects -within to a hash, but only surface-depth ones. - -=item $it->import() - -This import method is actually provided by L<Test::Stream::Exporter> and allows -you to import the constants generated for you. - -=back - -=head2 HOOKS - -=over 4 - -=item $self->init() - -This gives you the chance to set some default values to your fields. The only -argument is C<$self> with its indexes already set from the constructor. - -=back - -=head1 ACCESSORS - -To generate accessors you list them when using the module: - - use Test::Stream::ArrayBase accessors => [qw/foo/]; - -This will generate the following subs in your namespace: - -=over 4 - -=item import() - -This will let you import the constants - -=item foo() - -Getter, used to get the value of the C<foo> field. - -=item set_foo() - -Setter, used to set the value of the C<foo> field. - -=item FOO() - -Constant, returs the field C<foo>'s index into the class arrayref. This -function is also exported, but only when requested. Subclasses will also get -this function as a constant, not simply a method, that means it is copied into -the subclass namespace. - -=back - -=head1 SUBCLASSING - -You can subclass an existing ArrayBase class. - - use Test::Stream::ArrayBase - base => 'Another::ArrayBase::Class', - accessors => [qw/foo bar baz/], - -Once an ArrayBase class is used as a subclass it is locked and no new fields -can be added. All fields in any subclass will start at the next index after the -last field of the parent. All constants from base classes are added to -subclasses automatically. - -=head1 WHY? - -Switching to an arrayref base has resulted in significant performance boosts. - -When Test::Builder was initially refactored to support events, it was slow -beyond reason. A large part of the slowdown was due to the use of proper -methods instead of directly accessing elements. We also switched to using a LOT -more objects that have methods. - -=head1 SOURCE - -The source code repository for Test::More can be found at -F<http://github.com/Test-More/test-more/>. - -=head1 MAINTAINER - -=over 4 - -=item Chad Granum E<lt>exodist@cpan.orgE<gt> - -=back - -=head1 AUTHORS - -The following people have all contributed to the Test-More dist (sorted using -VIM's sort function). - -=over 4 - -=item Chad Granum E<lt>exodist@cpan.orgE<gt> - -=item Fergal Daly E<lt>fergal@esatclear.ie>E<gt> - -=item Mark Fowler E<lt>mark@twoshortplanks.comE<gt> - -=item Michael G Schwern E<lt>schwern@pobox.comE<gt> - -=item 唐鳳 - -=back - -=head1 COPYRIGHT - -There has been a lot of code migration between modules, -here are all the original copyrights together: - -=over 4 - -=item Test::Stream - -=item Test::Stream::Tester - -Copyright 2014 Chad Granum E<lt>exodist7@gmail.comE<gt>. - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -See F<http://www.perl.com/perl/misc/Artistic.html> - -=item Test::Simple - -=item Test::More - -=item Test::Builder - -Originally authored by Michael G Schwern E<lt>schwern@pobox.comE<gt> with much -inspiration from Joshua Pritikin's Test module and lots of help from Barrie -Slaymaker, Tony Bowden, blackstar.co.uk, chromatic, Fergal Daly and the perl-qa -gang. - -Idea by Tony Bowden and Paul Johnson, code by Michael G Schwern -E<lt>schwern@pobox.comE<gt>, wardrobe by Calvin Klein. - -Copyright 2001-2008 by Michael G Schwern E<lt>schwern@pobox.comE<gt>. - -This program is free software; you can redistribute it and/or -modify it under the same terms as Perl itself. - -See F<http://www.perl.com/perl/misc/Artistic.html> - -=item Test::use::ok - -To the extent possible under law, 唐鳳 has waived all copyright and related -or neighboring rights to L<Test-use-ok>. - -This work is published from Taiwan. - -L<http://creativecommons.org/publicdomain/zero/1.0> - -=item Test::Tester - -This module is copyright 2005 Fergal Daly <fergal@esatclear.ie>, some parts -are based on other people's work. - -Under the same license as Perl itself - -See http://www.perl.com/perl/misc/Artistic.html - -=item Test::Builder::Tester - -Copyright Mark Fowler E<lt>mark@twoshortplanks.comE<gt> 2002, 2004. - -This program is free software; you can redistribute it -and/or modify it under the same terms as Perl itself. - -=back |