# NAME

Do

# ABSTRACT

Development Framework

# SYNOPSIS

    package User;

    use Do 'Class';

    has 'fname';
    has 'lname';

    method greet(Str $name) {
      my $fname = $self->fname;
      my $lname = $self->lname;

      "Hey $name, I'm $fname $lname";
    }

    package main;

    my $user = User->new(fname => 'Al', lname => 'Newkirk');

    say $user->greet('You');

    1;

# DESCRIPTION

This package aims to provide a modern Perl development framework and
foundational set of types, functions, classes, patterns, and interfaces for
jump-starting application development.

# FRAMEWORK

Do (aka Data-Object) is a robust modern Perl development framework, embracing
Perl's multi-paradigm programming nature, flexibility and vast ecosystem that
many engineers already know and love.

# FRAMEWORK CORE

    package main;

    use Do;

    fun main() {
      # ...
    }

    1;

The framework's core configuration enables strict, warnings, Perl's 5.14
features, and configures the core type library, method signatures, and
autoboxing.

# FRAMEWORK LIBRARY

    package App::Library;

    use Do 'Library';

    our $User = declare 'User',
      as InstanceOf["App::User"];

    1;

The framework's library configuration established a [Type::Library](https://metacpan.org/pod/Type::Library) compliant
type library, as well as configuring [Type::Utils](https://metacpan.org/pod/Type::Utils) in the calling package.
Read more at [Data::Object::Library](https://metacpan.org/pod/Data::Object::Library).

# FRAMEWORK CLASS

    package App::User;

    use Do 'Class';

    has 'fname';
    has 'lname';

    1;

The framework's class configuration configures the calling package as a Moo
class, having the "has", "with", and "extends" keywords available. Read more at
[Data::Object::Class](https://metacpan.org/pod/Data::Object::Class).

# FRAMEWORK ROLE

    package App::Queuer;

    use Do 'Role';

    has 'queue';

    method dequeue() {
      # ...
    }

    method enqueue($job) {
      # ...
    }

    1;

The framework's role configuration configures the calling package as a Moo
role, having the "has", "with", and "extends" keywords available. Read more at
[Data::Object::Role](https://metacpan.org/pod/Data::Object::Role).

# FRAMEWORK RULE

    package App::Queueable;

    use Do 'Rule';

    requires 'dequeue';
    requires 'enqueue';

    1;

The framework's rule configuration configures the calling package as a Moo
role, intended to be used to classify interfaces. Read more at
[Data::Object::Rule](https://metacpan.org/pod/Data::Object::Rule).

# FRAMEWORK STATE

    package App::Env;

    use Do 'State';

    has 'vars';
    has 'args';
    has 'opts';

    1;

The framework's state configuration configures the calling package as a
singleton class with global state. Read more at [Data::Object::State](https://metacpan.org/pod/Data::Object::State).

# FRAMEWORK STRUCT

    package App::Data;

    use Do 'Struct';

    has 'auth';
    has 'user';
    has 'args';

    1;

The framework's struct configuration configures the calling package as a class
whose state becomes immutable after instantiation. Read more at
[Data::Object::Struct](https://metacpan.org/pod/Data::Object::Struct).

# FRAMEWORK ARRAY

    package App::Args;

    use Do 'Array';

    method command() {
      return $self->get(0);
    }

    1;

The framework's array configuration configures the calling package as a class
which extends the Array class. Read more at [Data::Object::Array](https://metacpan.org/pod/Data::Object::Array).

# FRAMEWORK CODE

    package App::Func;

    use Do 'Code';

    around BUILD($args) {
      $self->$orig($args);

      # ...
    }

    1;

The framework's code configuration configures the calling package as a class
which extends the Code class. Read more at [Data::Object::Code](https://metacpan.org/pod/Data::Object::Code).

# FRAMEWORK FLOAT

    package App::Amount;

    use Do 'Float';

    method currency(Str $code) {
      # ...
    }

    1;

The framework's float configuration configures the calling package as a class
which extends the Float class. Read more at [Data::Object::Float](https://metacpan.org/pod/Data::Object::Float).

# FRAMEWORK HASH

    package App::Data;

    use Do 'Hash';

    method logline() {
      # ...
    }

    1;

The framework's hash configuration configures the calling package as a class
which extends the Hash class. Read more at [Data::Object::Hash](https://metacpan.org/pod/Data::Object::Hash).

# FRAMEWORK INTEGER

    package App::Phone;

    use Do 'Integer';

    method format(Str $code) {
      # ...
    }

    1;

The framework's integer configuration configures the calling package as a class
which extends the Integer class. Read more at [Data::Object::Integer](https://metacpan.org/pod/Data::Object::Integer).

# FRAMEWORK NUMBER

    package App::ID;

    use Do 'Number';

    method find() {
      # ...
    }

    1;

The framework's number configuration configures the calling package as a class
which extends the Number class. Read more at [Data::Object::Number](https://metacpan.org/pod/Data::Object::Number).

# FRAMEWORK REGEXP

    package App::Path;

    use Do 'Regexp';

    method match() {
      # ...
    }

    1;

The framework's regexp configuration configures the calling package as a class
which extends the Regexp class. Read more at [Data::Object::Regexp](https://metacpan.org/pod/Data::Object::Regexp).

# FRAMEWORK SCALAR

    package App::OID;

    use Do 'Scalar';

    method find() {
      # ...
    }

    1;

The framework's scalar configuration configures the calling package as a class
which extends the Scalar class. Read more at [Data::Object::Scalar](https://metacpan.org/pod/Data::Object::Scalar).

# FRAMEWORK STRING

    package App::Title;

    use Do 'String';

    method generate() {
      # ...
    }

    1;

The framework's string configuration configures the calling package as a class
which extends the String class. Read more at [Data::Object::String](https://metacpan.org/pod/Data::Object::String).

# FRAMEWORK UNDEF

    package App::Fail;

    use Do 'Undef';

    method explain() {
      # ...
    }

    1;

The framework's undef configuration configures the calling package as a class
which extends the Undef class. Read more at [Data::Object::Undef](https://metacpan.org/pod/Data::Object::Undef).

# INSTALLATION

If you have cpanm, you only need one line:

    $ cpanm -qn Do

If you don't have cpanm, get it! It takes less than a minute, otherwise:

    $ curl -L https://cpanmin.us | perl - -qn Do

Add `Do` to the list of dependencies in `cpanfile`:

    requires "Do" => "1.00"; # 1.00 or newer

If cpanm doesn't have permission to install modules in the current Perl
installation, it will automatically set up and install to a local::lib in your
home directory.  See the [local::lib](https://metacpan.org/pod/local::lib) documentation for details on
enabling it in your environment. We recommend using a
[Perlbrew](https://github.com/gugod/app-perlbrew) or
[Plenv](https://github.com/tokuhirom/plenv) environment. These tools will help
you manage multiple Perl installations in your `$HOME` directory. They are
completely isolated Perl installations.

# AUTHOR

Al Newkirk, `awncorp@cpan.org`

# LICENSE

Copyright (C) 2011-2019, Al Newkirk, et al.

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

# PROJECT

[GitHub](https://github.com/iamalnewkirk/do)

[Contributing](https://github.com/iamalnewkirk/do/blob/master/README-DEVEL.mkdn)

[Reporting](https://github.com/iamalnewkirk/do/issues)

# SEE ALSO

To get the most out of this distribution, consider reading the following:

[Data::Object::Class](https://metacpan.org/pod/Data::Object::Class)

[Data::Object::Role](https://metacpan.org/pod/Data::Object::Role)

[Data::Object::Rule](https://metacpan.org/pod/Data::Object::Rule)

[Data::Object::Library](https://metacpan.org/pod/Data::Object::Library)

[Data::Object::Signatures](https://metacpan.org/pod/Data::Object::Signatures)
