package OpenTracing::Interface::Tracer;


use strict;
use warnings;


our $VERSION = '0.10';


use Role::MethodReturns;

use Types::Standard qw/ArrayRef Bool Dict HashRef Optional Str Undef/;
use Types::Common::Numeric qw/PositiveNum/;
use Types::Interface qw/ObjectDoesInterface/;



around get_scope_manager => instance_method ( ) {
    
    returns_maybe_object_does_interface( 'OpenTracing::Interface::ScopeManager',
        
        $original->( $instance => ( ) )
        
    )
};



around get_active_span => instance_method ( ) {
    
    returns_maybe_object_does_interface( 'OpenTracing::Interface::Span',
        
        $original->( $instance => ( ) )
        
    )
};



around start_active_span => instance_method ( Str  $operation_name, %options ) {
    
    ( Dict[
        
        child_of                => Optional[
            ObjectDoesInterface['OpenTracing::Interface::Span']        |
            ObjectDoesInterface['OpenTracing::Interface::SpanContext']
        ],
        references              => Optional[ ArrayRef[ HashRef ]],
        tags                    => Optional[ HashRef[ Str ] ],
        start_time              => Optional[ PositiveNum ],
        ignore_active_span      => Optional[ Bool ],
        finish_span_on_close    => Optional[ Bool ],
        
    ] )->assert_valid( \%options );
    
    returns_object_does_interface( 'OpenTracing::Interface::Scope',
    
        $original->( $instance => ( $operation_name, %options ) )
    )
};



around start_span => instance_method ( Str $operation_name, %options ) {
    
     ( Dict[
        
        child_of                => Optional[
            ObjectDoesInterface['OpenTracing::Interface::Span']        |
            ObjectDoesInterface['OpenTracing::Interface::SpanContext']
        ],
        references              => Optional[ ArrayRef[ HashRef ]],
        tags                    => Optional[ HashRef[ Str ] ],
        start_time              => Optional[ PositiveNum ],
        ignore_active_span      => Optional[ Bool ],
        
    ] )->assert_valid( \%options );
    
    returns_object_does_interface( 'OpenTracing::Interface::Span',
    
        $original->( $instance => ( $operation_name, %options ) )
    )
};



around inject_context => instance_method (
    (ObjectDoesInterface['OpenTracing::Interface::SpanContext']) $span_context,
    $carrier_format,
    $carrier
) {
    
    returns( Undef,
        
        $original->( $instance => ( $span_context, $carrier_format, $carrier ) )
        
    );
    
    return # we do not really want it to return undef, as perl relies on context
};



around extract_context => instance_method ( ) {
    
    returns_maybe_object_does_interface( 'OpenTracing::Interface::SpanContext',
        
        $original->( $instance => ( ) )
        
    )
};



1;