using System;
using System.Collections.Generic;
using System.Text;

namespace Apewer.Source
{

    /// <summary></summary>
    public abstract class Accessor<T> where T : class, IDatabase, new()
    {
        
        private T _source = null;

        private bool _disposed = false;

        /// <summary></summary>
        public Accessor() { }

        /// <summary></summary>
        protected virtual T Source
        {
            get
            {
                if (_source == null) _source = new T();
                return _source;
            }
        }

        /// <summary></summary>
        public virtual bool Connected
        {
            get
            {
                return (_source == null) ? false : _source.Online;
            }
        }

        /// <summary></summary>
        public virtual bool Disposed
        {
            get { return _disposed; }
        }

        /// <summary></summary>
        public virtual void Close()
        {
            if (_source == null) return;
            _source.Close();
        }

        /// <summary></summary>
        public virtual void Dispose()
        {
            if (_source != null)
            {
                _source.Dispose();
                _source = null;
            }
            _disposed = true;
        }

    }

}