NAME

Class::XSConstructor - a super-fast (but limited) constructor in XS

SYNOPSIS

  package Person {
    use Class::XSConstructor qw( name! age email phone );
    use Class::XSAccessor {
      accessors         => [qw( name age email phone )],
      exists_predicates => [qw(      age email phone )],
    };
  }

DESCRIPTION

Class::XSAccessor is able to provide you with a constructor for your class, but it's fairly limited. It basically just does:

  sub new {
    my $class = shift;
    bless { @_ }, ref($class)||$class;
  }

Class::XSConstructor goes a little further towards Moose-like constructors, adding the following features:

  • Supports initialization from a hashref as well as a list of key-value pairs.

  • Only initializes the attributes you specified. Given the example in the synposis:

      my $obj = Person->new(name => "Alice", height => "170 cm");

    The height will be ignored because it's not a defined attribute for the class.

  • Supports required attributes using an exclamation mark. The name attribute in the synopsis is required.

  • Provides support for type constraints.

      use Types::Standard qw(Str Int);
      use Class::XSConstructor (
        "name!"    => Str,
        "age"      => Int,
        "email"    => Str,
        "phone"    => Str,
      );

    Type constraints can also be provided as coderefs returning a boolean:

      use Types::Standard qw(Str Int);
      use Class::XSConstructor (
        "name!"    => Str,
        "age"      => Int,
        "email"    => sub { !ref($_[0]) and $_[0] =~ /\@/ },
        "phone"    => Str,
      );

    Type constraints are likely to siginificantly slow down your constructor.

    Note that Class::XSConstructor is only building your constructor for you. For read-write attributes, checking the type constraint in the accessor is your responsibility.

  • Supports Moose/Moo/Class::Tiny-style BUILD methods.

    Including __no_BUILD__.

CAVEATS

Inheritance will automatically work if you are inheriting from another Class::XSConstructor class, but you need to set @ISA before importing from Class::XSConstructor (which will happen at compile time!)

An easy way to do this is to use parent before using Class::XSConstructor.

  package Employee {
    use parent "Person";
    use Class::XSConstructor qw( employee_id! );
    use Class::XSAccessor { getters => [qw()] };
  }

BUGS

Please report any bugs to http://rt.cpan.org/Dist/Display.html?Queue=Class-XSConstructor.

SEE ALSO

Class::Tiny, Class::XSAccessor.

AUTHOR

Toby Inkster <tobyink@cpan.org>.

THANKS

To everybody in #xs on irc.perl.org.

COPYRIGHT AND LICENCE

This software is copyright (c) 2018 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.

DISCLAIMER OF WARRANTIES

THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.