Finance-Robinhood

 view release on metacpan or  search on metacpan

lib/Finance/Robinhood/Instrument.pm  view on Meta::CPAN

package Finance::Robinhood::Instrument;
use 5.010;
use strict;
use warnings;
use Carp;
our $VERSION = "0.21";
use Moo;
use JSON::Tiny qw[decode_json];
use strictures 2;
use namespace::clean;
use Finance::Robinhood::Market;
use Finance::Robinhood::Instrument::Split;
use Finance::Robinhood::Fundamentals;
#
has $_ => (
    is        => 'lazy',
    predicate => 1,
    builder   => sub {
        (caller(1))[3] =~ m[.+::(.+)$];
        shift->_get_raw->{$1};
    }
    )
    for (
        qw[bloomberg_unique day_trade_ratio min_tick_size margin_initial_ratio
        id maintenance_ratio name state symbol tradeable country type]);
#
has $_ => (is     => 'ro',
           coerce => \&Finance::Robinhood::_2_datetime
) for (qw[list_date]);
has $_ => (is        => 'lazy',
           predicate => 1,
           builder   => 1
) for (qw[fundamentals url]);
has $_ => (is        => 'lazy',
           predicate => 1,
           init_arg  => undef,
           builder   => 1
) for (qw[quote market splits]);
has $_ => (is => 'lazy', reader => "_get_$_") for (qw[raw]);

sub _build_raw {
    my $s = shift;
    my $url;
    if ($s->has_url) {
        $url = $s->url;
    }
    elsif ($s->has_id) {
        $url = Finance::Robinhood::endpoint('instruments') . $s->id . '/';
    }
    else {
        return {}    # We done messed up!
    }
    my ($status, $result, $raw)
        = Finance::Robinhood::_send_request(undef, 'GET', $url);
    return $result;
}

sub _build_quote {
    return Finance::Robinhood::quote(shift->symbol())->{results}[0];
}

sub historicals {
    return Finance::Robinhood::historicals(shift->symbol(), shift, shift);
}

sub _build_splits {

    # Upcoming stock splits
    my ($status, $result, $raw)
        = Finance::Robinhood::_send_request(undef, 'GET',
                                            shift->_get_raw->{'splits'});
    return [$result
                && $result->{results} ?
                map { Finance::Robinhood::Instrument::Split->new($_) }
                @{$result->{results}}
            : ()
    ];
}

sub _build_market {
    Finance::Robinhood::Market->new(url => shift->_get_raw->{'market'});
}

sub _build_fundamentals {
    Finance::Robinhood::Fundamentals->new(
                                    url => shift->_get_raw->{'fundamentals'});
}
1;

=encoding utf-8

=head1 NAME

Finance::Robinhood::Instrument - Single Financial Instrument

=head1 SYNOPSIS

    use Finance::Robinhood::Instrument;

    my $apple = Finance::Robinhood::instrument('AAPL');
    my $msft  = Finance::Robinhood::Instrument->new(id => '50810c35-d215-4866-9758-0ada4ac79ffa');

=head1 DESCRIPTION

This class represents a single financial instrument. Objects are usually
created by Finance::Robinhood so please use
Finance::Robinhood->instrument(...) unless you know the instrument ID.



( run in 1.498 second using v1.01-cache-2.11-cpan-364913b4093 )